package Test.拷贝;

import com.alibaba.fastjson.JSON;
import org.springframework.beans.BeanUtils;

/**
 * 可以发现，使用了BeanUtils.copyProperties之后呢，新订单和老订单对象的地址属性，
 * 指向同一个引用，也就是说，BeanUtils.copyProperties是浅拷贝。
 *
 * 当我们对oldOrder的shippingAddress修改时，newOrder的shippingAddress也会同时被修改。
 *
 * 我们日常开发的时候，经常使用BeanUtils.copyProperties，这时候尤其要注意，
 * 这个浅拷贝的坑，要不然某个引用属性被莫名奇妙修改了都不知道。
 */
public class Test {

    public static void main(String[] args) {
        Address oldAddress = new Address("广东", "湛江");
        Order oldOrder = new Order("666", oldAddress);

//        Order newOrder = new Order();
//        BeanUtils.copyProperties(oldOrder, newOrder);
//        System.out.println(oldOrder.getShippingAddress() == newOrder.getShippingAddress());
//
//
//
//        oldOrder.getShippingAddress().setCity("深圳");
//        System.out.println(JSON.toJSONString(oldOrder));
//        System.out.println(JSON.toJSONString(newOrder));

        Order newOrder = oldOrder.deepCopy();
        System.out.println(oldOrder.getShippingAddress() == newOrder.getShippingAddress());

        oldOrder.getShippingAddress().setCity("深圳");
        System.out.println(JSON.toJSONString(oldOrder));
        System.out.println(JSON.toJSONString(newOrder));
    }
}

//输出
//true
//{"orderId":"666","shippingAddress":{"city":"深圳","province":"广东"}}
//{"orderId":"666","shippingAddress":{"city":"深圳","province":"广东"}}